<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="GtW0g" id="GtW0g"><span data-lake-id="ub4958aff" id="ub4958aff">典型回答</span></h1>
  <p data-lake-id="ud422dc7f" id="ud422dc7f"><span data-lake-id="ub8698b61" id="ub8698b61">​</span><br></p>
  <p data-lake-id="u22a1f855" id="u22a1f855"><span data-lake-id="u037cc0e2" id="u037cc0e2">QPS，指的是系统每秒能处理的请求数(Query Per Second) ，在Web应用中我们更关注的是Web应用每秒能处理的request数量。这个是衡量系统性能的重要指标。</span></p>
  <p data-lake-id="ub0dc2457" id="ub0dc2457"><span data-lake-id="u319a9ed5" id="u319a9ed5">​</span><br></p>
  <p data-lake-id="u45723ddb" id="u45723ddb"><span data-lake-id="u72b0c576" id="u72b0c576">RT，指的是响应时间(Response Time)，是指从客户端发一个请求开始计时，到客户端接收到从服务器端返回的响应结果结束所经历的时间。</span></p>
  <p data-lake-id="ub078c7a3" id="ub078c7a3"><span data-lake-id="ud098c6d6" id="ud098c6d6">​</span><br></p>
  <p data-lake-id="u2e3b1d28" id="u2e3b1d28"><span data-lake-id="u9b0e660d" id="u9b0e660d">​</span><br></p>
  <h1 data-lake-id="gPHx1" id="gPHx1"><span data-lake-id="u4af9fa76" id="u4af9fa76">扩展知识</span></h1>
  <h2 data-lake-id="W0Usi" id="W0Usi"><span data-lake-id="ub05cc23f" id="ub05cc23f">RT</span></h2>
  <p data-lake-id="u2969f1c1" id="u2969f1c1"><br></p>
  <p data-lake-id="u50ae8b6b" id="u50ae8b6b"><span data-lake-id="ub7441660" id="ub7441660">响应时间(Response Time)，是指从客户端发一个请求开始计时，到客户端接收到从服务器端返回的响应结果结束所经历的时间。</span></p>
  <p data-lake-id="u76bb18f6" id="u76bb18f6"><br></p>
  <p data-lake-id="u48bdba65" id="u48bdba65"><span data-lake-id="u7b4b0b13" id="u7b4b0b13">当我们评价一个网站的"快"和"慢"的时候，其实说的就是他的RT时间的长和短。当我们访问某个网站，有时候我们会说这个网站很"卡"，其实言下之意说的就是这个网站的RT很长。</span></p>
  <p data-lake-id="ufabf5007" id="ufabf5007"><br></p>
  <p data-lake-id="u3de8aa63" id="u3de8aa63"><span data-lake-id="u57d6383e" id="u57d6383e">如果一个网站的RT很长的话，就会特别的影响用户体验。所以，RT是很重要的一个指标。也是各个网站需要重点优化的。</span></p>
  <p data-lake-id="u5e35559d" id="u5e35559d"><br></p>
  <p data-lake-id="ue84350d1" id="ue84350d1"><span data-lake-id="uf0ead65b" id="uf0ead65b">拿一个游乐园的例子来说明一下可能会比较容易理解，比如我们去迪士尼乐园游玩时候，大多数的项目都是需要排队的。</span></p>
  <p data-lake-id="ue630a184" id="ue630a184"><br></p>
  <p data-lake-id="uea64c71f" id="uea64c71f"><span data-lake-id="ub697fa70" id="ub697fa70">为了让游客知道一个项目需要排队多久才能玩上，迪士尼做了很多事情，比如他们有一个App，专门可以提示每个项目的预计排队时间。再有就是每个项目的排队处都有一个小牌牌，上面写着预计排队时间。</span></p>
  <p data-lake-id="ucfad06a2" id="ucfad06a2"><br></p>
  <p data-lake-id="u15d162a5" id="u15d162a5"><img src="https://cdn.nlark.com/yuque/0/2022/jpeg/5378072/1666699215659-da7a747b-61e7-4338-9e90-77ac6c4fab8f.jpeg?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_17%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"><span data-lake-id="uee138e95" id="uee138e95">￼</span></p>
  <p data-lake-id="u41deb277" id="u41deb277"><br></p>
  <p data-lake-id="u4da44241" id="u4da44241"><span data-lake-id="ue1ccfd49" id="ue1ccfd49">但是，这个时间并不是凭空设定出来的，而是『计算』出来的。</span></p>
  <p data-lake-id="u6bdb41f7" id="u6bdb41f7"><br></p>
  <p data-lake-id="uc2ea9bab" id="uc2ea9bab"><span data-lake-id="uf3e7de0f" id="uf3e7de0f">迪士尼的排队时间计算方法：</span></p>
  <p data-lake-id="ucf7d07e5" id="ucf7d07e5"><br></p>
  <p data-lake-id="u883afdc2" id="u883afdc2"><span data-lake-id="ue98f53de" id="ue98f53de">1、迪士尼在每个项目的入口处和出口处都会设置工作人员。<br></span><span data-lake-id="u5758f176" id="u5758f176">2、入口处工作人员随机寻找游客，给游客一张小纸条，上面记录着游客开始排队的时间。<br></span><span data-lake-id="u6cf82b34" id="u6cf82b34">3、入口处工作人员提醒游客，项目游览玩之后，在出口处把小纸条交还给出口处的工作人员。<br></span><span data-lake-id="ua35b1a49" id="ua35b1a49">4、出口处工作人员在收到游客的小纸条后，会用：当前时间-游客开始排队的时间 = 排队时长。<br></span><span data-lake-id="u9f67327d" id="u9f67327d">5、为了尽量让数据准确，一般会收集多个排队时长之后，计算一个平均值。</span></p>
  <p data-lake-id="u68136b0c" id="u68136b0c"><br></p>
  <p data-lake-id="ua1340d41" id="ua1340d41"><span data-lake-id="u793a990a" id="u793a990a">以上就是迪士尼的排队时间计算法。其实，这也是RT的计算方法。在一个请求开始的时候记录时间，请求结束的时候再记录时间，两个时间的差值，就是RT了。</span></p>
  <p data-lake-id="ue57fc312" id="ue57fc312"><br></p>
  <p data-lake-id="u37a6a8eb" id="u37a6a8eb"><span data-lake-id="u34ae8151" id="u34ae8151">迪士尼的一个项目的RT包含了多个时间段：排队时间、听项目讲解时间、项目准备时间、项目游玩时间等。</span></p>
  <p data-lake-id="ue88d23dd" id="ue88d23dd"><br></p>
  <p data-lake-id="u4489bf1c" id="u4489bf1c"><span data-lake-id="ucf088139" id="ucf088139">服务器响应时间也有多部分组成，一般包含：请求发送时间、网络传输时间和服务器处理时间等三部分。</span></p>
  <p data-lake-id="ucd5153bf" id="ucd5153bf"><br></p>
  <h2 data-lake-id="lBOzB" id="lBOzB"><span data-lake-id="u6e3d840e" id="u6e3d840e">QPS </span></h2>
  <p data-lake-id="u2b682452" id="u2b682452"><br></p>
  <p data-lake-id="u63cebcc4" id="u63cebcc4"><span data-lake-id="ufd4f07d7" id="ufd4f07d7">QPS，指的是系统每秒能处理的请求数(Query Per Second) ，在Web应用中我们更关注的是Web应用每秒能处理的request数量。这个是衡量系统性能的重要指标。有时候，我们也称之为吞吐量。</span></p>
  <p data-lake-id="ue2d23f8e" id="ue2d23f8e"><br></p>
  <p data-lake-id="u73e47871" id="u73e47871"><span data-lake-id="u59ac144a" id="u59ac144a">QPS和RT几乎总是成对出现的。当我们评价迪士尼的一个项目的好坏的时候，通常会包含这几个指标：是否好玩、游玩时长以及可以同时容纳多少人。</span></p>
  <p data-lake-id="u9071a285" id="u9071a285"><br></p>
  <p data-lake-id="u6cbb2fb2" id="u6cbb2fb2"><span data-lake-id="uec133ba8" id="uec133ba8">这个可以同时容纳多少人，就可以简单的理解为QPS。很大程度上，一个项目同时可以容纳多少人，其实会大大的影响游客的游玩时长。</span></p>
  <p data-lake-id="u2dbdd3eb" id="u2dbdd3eb"><br></p>
  <p data-lake-id="ue447278c" id="ue447278c"><span data-lake-id="uc7651644" id="uc7651644">所以，QPS和RT之间是有着一定的关系的：</span></p>
  <p data-lake-id="u3137680c" id="u3137680c"><br></p>
  <pre lang="java"><code>
RT= 并发数/QPS
QPS= 并发数/RT
</code></pre>
  <p data-lake-id="u4863bd60" id="u4863bd60"><br></p>
  <p data-lake-id="u7f280fd1" id="u7f280fd1"><span data-lake-id="u33fe13a1" id="u33fe13a1">虽然上面的等式看上去，在并发数一定的情况下，想要提升QPS的话就只能降低RT。但其实并不是，以上只是QPS的计算方法。想要提升QPS往往有很多手段。</span></p>
  <p data-lake-id="u94542608" id="u94542608"><br></p>
  <p data-lake-id="u2fa4a358" id="u2fa4a358"><span data-lake-id="uc4c3a1f0" id="uc4c3a1f0">就像想要提升游乐设施的吞吐量，最首先想到的办法就是升级设备，比如增加游乐场地的面积，增加设备的座位数目，增加排队的队伍个数等。</span></p>
  <p data-lake-id="u41cf4767" id="u41cf4767"><br></p>
  <p data-lake-id="u397efa11" id="u397efa11"><span data-lake-id="ufa27e7af" id="ufa27e7af">在计算机系统中，想要提升QPS，主要可以在CPU、内存等硬件上面下功夫，比如提升CPU利用率、增加CPU数目、提升内存等。</span></p>
  <p data-lake-id="udcfc5806" id="udcfc5806"><br></p>
  <h2 data-lake-id="cjbQl" id="cjbQl"><span data-lake-id="u21aa438f" id="u21aa438f">并发用户数</span></h2>
  <p data-lake-id="u5f73fa12" id="u5f73fa12"><span data-lake-id="u079d7d6e" id="u079d7d6e">并发用户数指的就是同时跑到一个项目前面排队的人数。<br></span><img src="https://cdn.nlark.com/yuque/0/2022/jpeg/5378072/1666699215665-3e0a4a3e-958c-48c4-8197-d249ec39f159.jpeg?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_19%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"><span data-lake-id="ue3172020" id="ue3172020">￼</span></p>
  <p data-lake-id="ua39433e3" id="ua39433e3"><br></p>
  <p data-lake-id="u7a0d2e19" id="u7a0d2e19"><span data-lake-id="u7fe68eba" id="u7fe68eba">关于并发用户数有两种常见的错误观点。</span></p>
  <p data-lake-id="u612ba2e8" id="u612ba2e8"><br></p>
  <p data-lake-id="ub9a7ab08" id="ub9a7ab08"><span data-lake-id="ub5af0f1c" id="ub5af0f1c">一种错误观点是把并发用户数量理解为使用系统的全部用户的数量；（比如迪士尼的飞跃地平线项目一天可能会接纳50万人，我们不能说这个50万就是并发用户数）</span></p>
  <p data-lake-id="ufdd77604" id="ufdd77604"><br></p>
  <p data-lake-id="ufa5ee292" id="ufa5ee292"><span data-lake-id="uf56b8fea" id="uf56b8fea">还有一种错误观点是把用户在线数量理解为并发用户数量。（比如晚上六点的时候，迪士尼的飞跃地平线项目排队加观看人数共有1万人，我们不能说这个1万就是并发用户数）</span></p>
  <p data-lake-id="u8f11a14f" id="u8f11a14f"><br></p>
  <p data-lake-id="u3cf81ba0" id="u3cf81ba0"><span data-lake-id="u6cc02cb7" id="u6cc02cb7">并发用户数量的正确理解为：在</span><strong><span data-lake-id="u05d2609b" id="u05d2609b">同一时刻</span></strong><span data-lake-id="u187bd5eb" id="u187bd5eb">与服务器</span><strong><span data-lake-id="ud446232f" id="ud446232f">进行了交互</span></strong><span data-lake-id="ua437e103" id="ua437e103">的</span><strong><span data-lake-id="u30aa2f1c" id="u30aa2f1c">在线用户数量</span></strong><span data-lake-id="uf849c473" id="uf849c473">。（我们说，晚上六点的时候，共有8000人正在排队使用飞跃地平线这个项目。这才是并发用户数）</span></p>
  <p data-lake-id="u895cb74f" id="u895cb74f"><br></p>
  <p data-lake-id="ub33d5768" id="ub33d5768"><span data-lake-id="uba4b8e3d" id="uba4b8e3d">拿系统来说，我们说淘宝详情页的并发用户数，其实说的是同一时刻请求查看详情页的用户个数。有些用户虽然也在浏览详情页，但是它并没有在并发时刻和系统有交互，这就不算的。</span></p>
  <p data-lake-id="ua082e3d5" id="ua082e3d5"><br></p>
  <h2 data-lake-id="rJvqJ" id="rJvqJ"><span data-lake-id="ue78586c8" id="ue78586c8">最佳线程数</span></h2>
  <p data-lake-id="ud9609882" id="ud9609882"><br></p>
  <p data-lake-id="u6ff0fab0" id="u6ff0fab0"><span data-lake-id="u9841a5fe" id="u9841a5fe">最佳线程数指的就是一个项目最多可以容纳的人数，这里的容纳可以包含排队的人数。<br></span><img src="https://cdn.nlark.com/yuque/0/2022/jpeg/5378072/1666699215675-ceca63b2-2ac0-43ac-a384-c07234331db3.jpeg?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_17%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"><span data-lake-id="u509eaaee" id="u509eaaee">￼</span></p>
  <p data-lake-id="uc3ca7cac" id="uc3ca7cac"><br></p>
  <p data-lake-id="u037c0844" id="u037c0844"><span data-lake-id="uc78a3128" id="uc78a3128">迪士尼每新开一个场馆或者一个游戏项目的时候，都会是一个试运营的阶段。在试运营阶段，通过不断调整并发用户数来观察整个场馆或者项目的运行情况。</span></p>
  <p data-lake-id="u80d7039a" id="u80d7039a"><br></p>
  <p data-lake-id="ucad2d720" id="ucad2d720"><span data-lake-id="ue43a2a40" id="ue43a2a40">除了上线新场馆和新项目以外，有的是在节假日之前也会有一些类似的实验。</span></p>
  <p data-lake-id="u83eceb34" id="u83eceb34"><br></p>
  <p data-lake-id="u1302ec5a" id="u1302ec5a"><span data-lake-id="u7624bcaa" id="u7624bcaa">这和计算机软件的压测很像。就是不断的提高请求数目，来观察系统的QPS和系统的其他指标，如CPU情况、内存情况等。</span></p>
  <p data-lake-id="u1c964e6c" id="u1c964e6c"><br></p>
  <p data-lake-id="u3a20bfbb" id="u3a20bfbb"><span data-lake-id="u05993d98" id="u05993d98">性能压测的情况下，起初随着用户数的增加，QPS会上升并对CPU等影响不大，当到了一定的阈值之后，用户数量增加QPS并不会增加，或者增加不明显，同时CPU Load有飙高、内存占用大等情况发生。随之而来的伴随着请求的响应时间大幅增加。这个阈值我们认为是最佳线程数。</span></p>
  <p data-lake-id="ub53c0b22" id="ub53c0b22"><br></p>
  <p data-lake-id="ue20b7c47" id="ue20b7c47"><span data-lake-id="u08cb8f4f" id="u08cb8f4f">如果并发请求数目，超过了系统的最佳线程数，那么就会导致激烈的资源竞争，随着资源的匮乏甚至枯竭，整个系统也就面临着灾难。</span></p>
  <p data-lake-id="u5215ba3e" id="u5215ba3e"><br></p>
  <p data-lake-id="u40582496" id="u40582496"><br></p>
  <p data-lake-id="u9dc67eb1" id="u9dc67eb1"><br></p>
 </body>
</html>